package persistencia;

import java.sql.Connection;
import persistencia.derby.DerbyDAOFactory;

/**
 * Clase Abstracta que representa la factoria para el manejo de la Base de
 * Datos, en la misma se implementa el patron Singleton para obtener un objeto
 * de una clase que extienda de esta clase (siempre el mismo).
 *
 * @author Nicolás Garay
 * @author Alejandro Jacquet
 * @author Rita Romani
 */
public abstract class DAOFactory {

    /**
     * Atributo estático que contiene un objeto de una clase que extienda de
     * DAOFactory.
     *
     */
    private static DAOFactory factory = null;

    /**
     * Método abstracto que retorna un objeto de una clase que implementa la
     * interface SubscriptionDAO.
     *
     * @return SubscriptionDAO
     */
    public abstract SubscriptionDAO getSubscriptionDAO();

    /**
     * Método estático que devuelve un objeto de una clase que extiende de esta
     * clase, en este caso la clase utilizada es
     * persistencia.derby.DerbyDAOFactory. Implementa el patrón Singleton para
     * devolver el objeto.
     *
     * @return DAOFactory
     * @throws DAOException excepción lanzada por la Base de Datos
     */
    public static DAOFactory getDAOFactory() throws DAOException {
        if (factory == null) {
            factory = new DerbyDAOFactory();
        }
        return factory;
    }

    /**
     * Método abstracto que devuelve la conexión con la Base de Datos.
     *
     * @return Connection conexión con la Base de Datos.
     * @throws DAOException excepción lanzada por la Base de Datos.
     */
    public abstract Connection getConexion() throws DAOException;

    /**
     * Método abstracto que cierra la conexión a la Base de Datos que le pasamos
     * como atributo.
     *
     * @param conexion objeto de la clase Connection que será cerrada su
     * conexión.
     * @throws DAOException excepción lanzada por la Base de Datos.
     */
    public abstract void closeConexion(Connection conexion) throws DAOException;
}
